package com.heima.search.listener;

import com.alibaba.fastjson.JSON;
import com.heima.common.constants.ArticleConstants;
import com.heima.model.search.vos.SearchArticleVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
@Slf4j
//主要功能是从Kafka消息队列中接收文章同步的消息，解析消息内容，然后将文章信息同步到Elasticsearch索引中
//实现实时的数据同步，确保Elasticsearch中的文章数据与Kafka中的消息数据保持一致，从而支持快速的文章搜索功能
public class SyncArticleListener {
    @Autowired
    //使用Spring的依赖注入功能，将RestHighLevelClient注入到这个类中
    //RestHighLevelClient是Elasticsearch提供的Java客户端，用于与Elasticsearch集群进行交互
    private RestHighLevelClient restHighLevelClient;

    //这是一个Spring Kafka的注解，用于监听指定的Kafka主题
    //当有消息发布到ArticleConstants.ARTICLE_ES_SYNC_TOPIC时，会触发onMessage方法
    //文章模块在生成模板存储在minio之后，会调用createArticleESIndex方法，通过主题调用该方法
    @KafkaListener(topics = ArticleConstants.ARTICLE_ES_SYNC_TOPIC)
    public void onMessage(String message){
        //检查消息是否为空或仅包含空白字符。如果不是，则继续执行
        if(StringUtils.isNotBlank(message)){

            log.info("SyncArticleListener,message={}",message);

            //使用Fastjson库将接收到的JSON格式的消息转换为SearchArticleVo对象
            SearchArticleVo searchArticleVo = JSON.parseObject(message, SearchArticleVo.class);
            //创建一个新的IndexRequest对象，指定要索引的Elasticsearch索引名称为app_info_article
            IndexRequest indexRequest = new IndexRequest("app_info_article");
            //设置索引请求的文档ID，即SearchArticleVo对象的ID
            indexRequest.id(searchArticleVo.getId().toString());
            //设置索引请求的文档内容为接收到的消息字符串，并指定内容类型为JSON
            indexRequest.source(message, XContentType.JSON);
            try {
                //使用Elasticsearch的Java客户端将文档索引到指定的索引中,RequestOptions.DEFAULT表示使用默认的请求配置
                restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                e.printStackTrace();
                log.error("sync es error={}",e);
            }
        }

    }
}